<?php
/**
 * author:歪妻
 * Date: 2020/11/6 0006
 */


/**
 * 博客安装程序功能
 *
 * @return array(count array, error string)
 */
function installBlog(PDO $pdo)
{
    // 获得几个有用的函数路径
    $root = getRootPath();
    $database = getDatabasePath();
    $error = '';

    // 一种安全措施，以避免任何人重置数据库（如果已存在）
    if (is_readable($database) && filesize($database) > 0)
    {
        $error = '请在重新安装之前手动删除现有数据库data_v3/data/data.sqlite';

    }
    // 为数据库创建一个空文件
    if (!$error) {
        $createdOk = @touch($database);
        if (!$createdOk) {
            $error = sprintf('无法创建数据库，请允许服务器在以下位置创建新文件 \'%s\'', dirname($database));
        }
    }
    // 抓取我们要在数据库上运行的SQL命令
    if (!$error) {
        $sql = file_get_contents($root . './../data/init.sql');
        if ($sql === false) {
            $error = '找不到SQL文件';
        }
    }
    //连接到新数据库并尝试运行SQL命令if (!$error)
    if (!$error){
        $result  = $pdo->exec($sql);
        if ($result === false) {
            $error = '无法运行SQL,请删除data_v3/data/data.sqlite 。错误：' . print_r($pdo->errorInfo(), true);
        }
    }
    // 查看我们创建了多少行（如果有）
    $count = array();
    foreach(array('post', 'comment') as $tableName)
    {
        if (!$error)
        {
            $sql = "SELECT COUNT(*) AS c FROM " . $tableName;
            $stmt = $pdo->query($sql);
            if ($stmt)
            {
                // 我们将每个计数存储在关联数组中
                $count[$tableName] = $stmt->fetchColumn();
            }
        }
    }
    return array($count, $error);

}

/**
 * 更新数据库中的管理员用户
 *
 * @param PDO $pdo
 * @param string $username
 * @param integer $length
 * @return array Duple of (password, error)
 */
function createUser(PDO $pdo, $username, $length = 10)
{
    // 该算法创建一个随机密码
    $alphabet = range(ord('A'), ord('z'));
    $alphabetLength = count($alphabet);
    $password = '';
    for($i = 0; $i < $length; $i++)
    {
        $letterCode = $alphabet[rand(0, $alphabetLength - 1)];
        $password .= chr($letterCode);
    }
    $error = '';
    // 将凭据插入数据库
    $sql = "
        UPDATE
            user
        SET
            password = :password, created_at = :created_at, is_enabled = 1            
        WHERE 
            username = :username
    ";
    $stmt = $pdo->prepare($sql);
    if ($stmt === false)
    {
        $error = '无法更新用户';
    }
    if (!$error)
    {
        // 创建密码的哈希值，以使被盗的用户数据库（几乎）一文不值
        $hash = password_hash($password, PASSWORD_DEFAULT);
        if ($hash === false)
        {
            $error = '密码哈希失败';
        }
    }
    // 插入用户详细信息，包括哈希密码
    if (!$error)
    {
        $result = $stmt->execute(
            array(
                'username' => $username,
                'password' => $hash,
                'created_at' => getSqlDateForNow(),
            )
        );
        if ($result === false)
        {
            $error = '无法更新用户';
        }
    }
    if ($error)
    {
        $password = '';
    }
    return array($password, $error);
}